#pragma once
#include "../functions.h"

void areas() {
  const short figure =
      get_choice("Фигуры", {"Окружность", "Треугольник", "Четырёхугольник",
                            "Правильный многоугольник"});

  short operation, option;

  double abc, a, b, c, d, d_1, d_2, h, m, n, p, r, radians, alpha,
      operation_result;

  switch (figure) {
    case 1:
      operation = get_choice("Операция", {"Через радиус", "Через диаметр"});

      switch (operation) {
        case 1:
          r = numeric_input("Радиус окружности (r)");
          operation_result = M_PI * pow(r, 2);

          print_equation(
              {get_greek_letter("pi"), " * r", get_superscript(2), ""});
          print_equation(
              {M_PI, " * ", r, get_superscript(2), operation_result});

          break;
        case 2:
          d = numeric_input("Диаметр окружности (d)");
          operation_result = M_PI_4 * pow(d, 2);

          print_equation(
              {get_greek_letter("pi"), "d", get_superscript(2), "/4", ""});
          print_equation({to_string(M_PI), " * ", d, get_superscript(2), " / 4",
                          operation_result});

          break;
      }
      break;
    case 2:
      operation = get_choice(
          "Операция", {"Через основание и высоту", "Через две стороны и угол",
                       "Через три стороны", "Через радиус вписанной окружности",
                       "Через радиус описанной окружности"});

      switch (operation) {
        case 1:
          a = numeric_input("Основание треугольника (a)");
          h = numeric_input("Высота треугольника (h)");
          operation_result = a * h / 2;

          print_equation({"ah/2", ""});
          print_equation({a, " * ", h, " / 2", operation_result});

          break;
        case 2:
          a = numeric_input("Первая сторона треугольника (a)");
          b = numeric_input("Вторая сторона треугольника (b)");
          alpha = numeric_input("Угол между сторонами в градусах (" +
                                get_greek_letter("alpha") + ')');
          radians = convert_degree_to_radians(alpha);
          operation_result = a * b * sin(radians) / 2;

          print_equation({"ab * sin(", get_greek_letter("alpha"), ") / 2", ""});
          print_equation(
              {a, " * ", b, " * ", "sin(", alpha, ")", operation_result});

          break;
        case 3:
          a = numeric_input("Первая сторона треугольника");
          b = numeric_input("Вторая сторона треугольника");
          c = numeric_input("Третья сторона треугольника");
          p = (a + b + c) / 2;
          operation_result = sqrt(p * (p - a) * (p - b) * (p - c));
          break;
        case 4:
          r = numeric_input("Радиус окружности");
          p = numeric_input("Полупериметр треугольника");
          operation_result = r * p;
          break;
        case 5:
          r = numeric_input("Радиус окружности");
          abc = numeric_input("Произведение сторон треугольника");
          operation_result = abc / (4 * r);
          break;
      }
      break;
    case 3:
      option = get_choice(
          "Фигуры", {"Произвольный четырёхугольник", "Прямоугольник", "Квадрат",
                     "Параллелограмм", "Ромб", "Трапеция"});
      switch (option) {
        case 1:
          d_1 = numeric_input("Первая диагональ");
          d_2 = numeric_input("Вторая диагональ");
          alpha = numeric_input("Угол между диагоналями");
          radians = convert_degree_to_radians(alpha);
          operation_result = 0.5 * d_1 * d_2 * sin(radians);
          break;
        case 2:
          operation = get_choice("Операция",
                                 {"Через две стороны",
                                  "Через диагональ и угол между диагоналями"});
          switch (operation) {
            case 1:
              a = numeric_input("Первая сторона");
              b = numeric_input("Вторая сторона");
              operation_result = a * b;
              break;
            case 2:
              d = numeric_input("Диагональ");
              alpha = numeric_input("Угол между диагоналями");
              radians = convert_degree_to_radians(alpha);
              operation_result = 0.5 * pow(d, 2) * sin(radians);
              break;
          }
          break;
        case 3:
          operation =
              get_choice("Операция", {"Через сторону", "Через диагональ"});
          switch (operation) {
            case 1:
              a = numeric_input("Сторона");
              operation_result = pow(a, 2);
              break;
            case 2:
              d = numeric_input("Диагональ");
              operation_result = 0.5 * pow(d, 2);
              break;
          }
          break;
        case 4:
          operation =
              get_choice("Операция", {"Через основание и высоту",
                                      "Через две стороны и угол между ними",
                                      "Через диагонали и угол между ними"});
          switch (operation) {
            case 1:
              a = numeric_input("Основание");
              h = numeric_input("Высота");
              operation_result = a * h;
              break;
            case 2:
              a = numeric_input("Первая сторона");
              b = numeric_input("Вторая сторона");
              alpha = numeric_input("Угол между сторонами");
              radians = convert_degree_to_radians(alpha);
              operation_result = a * b * sin(radians);
              break;
            case 3:
              d_1 = numeric_input("Первая диагональ");
              d_2 = numeric_input("Вторая диагональ");
              alpha = numeric_input("Угол между диагоналями");
              radians = convert_degree_to_radians(alpha);
              operation_result = 0.5 * d_1 * d_2 * sin(radians);
              break;
          }
          break;
        case 5:
          operation =
              get_choice("Операция", {"Через основание и высоту",
                                      "Через сторону и угол между сторонами",
                                      "Через диагонали"});
          switch (operation) {
            case 1:
              a = numeric_input("Основание");
              h = numeric_input("Высота");
              operation_result = a * h;
              break;
            case 2:
              a = numeric_input("Сторона");
              alpha = numeric_input("Угол между сторонами");
              radians = convert_degree_to_radians(alpha);
              operation_result = pow(a, 2) * sin(radians);
              break;
            case 3:
              d_1 = numeric_input("Первая диагональ");
              d_2 = numeric_input("Вторая диагональ");
              operation_result = 0.5 * d_1 * d_2;
              break;
          }
          break;
        case 6:
          operation =
              get_choice("Операция", {"Через основания и высоту",
                                      "Через среднюю линию и высоту",
                                      "Через диагонали и угол между ними"});
          switch (operation) {
            case 1:
              a = numeric_input("Первое основание");
              b = numeric_input("Второе основание");
              h = numeric_input("Высота");
              operation_result = (a + b) / 2 * h;
              break;
            case 2:
              m = numeric_input("Средняя линия");
              h = numeric_input("Высота");
              operation_result = m * h;
              break;
            case 3:
              d_1 = numeric_input("Первая диагональ");
              d_2 = numeric_input("Вторая диагональ");
              alpha = numeric_input("Угол между диагоналями");
              radians = convert_degree_to_radians(alpha);
              operation_result = 0.5 * d_1 * d_2 * sin(radians);
              break;
          }
          break;
      }
      break;
    case 4:
      operation = get_choice(
          "Операция", {"Через полупериметр и радиус вписанной окружности",
                       "Через количество углов, длину сторон и радиус "
                       "вписанной окружности"});
      switch (operation) {
        case 1:
          p = numeric_input("Полупериметр");
          r = numeric_input("Радиус вписанной окружности");
          operation_result = p * r;
          break;
        case 2:
          n = numeric_input("Количество углов");
          a = numeric_input("Длина стороны");
          r = numeric_input("Радиус вписанной окружности");
          operation_result = 0.5 * a * n * r;
          break;
      }
      break;
  }
}